package com.ywl.gulimall.product.exception;

import com.alibaba.fastjson.JSONObject;
import com.ywl.common.exception.BizCodeEnum;
import com.ywl.common.utils.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/**
 * 全局异常处理
 */
@Slf4j
@RestControllerAdvice("com.ywl.gulimall.product.controller")
public class GulimallControllerAdvice {

    /**
     * 统一的参数提交校验
     * @param e
     * @return
     */
    @ExceptionHandler(value = MethodArgumentNotValidException.class)
    public R exceptionHandler(MethodArgumentNotValidException e) {
        log.info("统一参数非法异常处理，异常信息：{}, 异常类型：{}", e.getMessage(), e.getClass());
        JSONObject object = new JSONObject();
        e.getBindingResult().getFieldErrors().forEach(item->{
            object.put(item.getField(), item.getDefaultMessage());
        });
        return R.error(BizCodeEnum.ARGUMENT_NOT_VALID.getCode(), BizCodeEnum.ARGUMENT_NOT_VALID.getMessage())
                .put("data", object);
    }

    /**
     * 统一系统未知异常处理
     * @param e
     * @return
     */
    @ExceptionHandler(value = Throwable.class)
    public R handler(Throwable e) {
        log.info("统一拦截系统未知异常：", e);
        return R.error(BizCodeEnum.UNKNOW_EXCEPION.getCode(), BizCodeEnum.UNKNOW_EXCEPION.getMessage());
    }
}
